package com.mastercard.assets.web.struts.forms ;

import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.upload.FormFile;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.jpa.TblCategoria;
import com.mastercard.assets.jpa.TblForma;
import com.mastercard.assets.jpa.TblFormaSalida;
import com.mastercard.assets.jpa.TblSubcateg;
import com.mastercard.assets.jpa.TblUsuario;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.util.to.MultipleDataTO;
import com.mastercard.assets.web.util.to.UserLogin;

public class FormasEditarForm
	extends
		FormasForm
{
	private int cveForma ;
	private int cveSalida ;
	private String nombre ;
	private String descripcion ;
	private String[ ] nombreSalidas ;
	private String[ ] descripcionSalidas ;
	private List< MultipleDataTO > salidas ;
	private List< TblFormaSalida > formaSalidas ;
	private FormFile archivoForma ;
	private String archivoFormaName ;
	private int[ ] formasSalidasId ;
	private String hayArchivo ;
	private int existFile ;

	public int getExistFile() {
		return existFile;
	}

	public void setExistFile(int existFile) {
		this.existFile = existFile;
	}

	public String getHayArchivo() {
		return hayArchivo;
	}

	public void setHayArchivo(String hayArchivo) {
		this.hayArchivo = hayArchivo;
	}

	public int getCveSalida() {
		return cveSalida;
	}

	public void setCveSalida(int cveSalida) {
		this.cveSalida = cveSalida;
	}

	public int[] getFormasSalidasId() {
		return formasSalidasId;
	}

	public void setFormasSalidasId(int[] formasSalidasId) {
		this.formasSalidasId = formasSalidasId;
	}

	public List<TblFormaSalida> getFormaSalidas() {
		return formaSalidas;
	}

	public void setFormaSalidas(List<TblFormaSalida> formaSalidas) {
		this.formaSalidas = formaSalidas;
//		if( formaSalidas != null )
//		{
//			// tamanio 
//			int tam = formaSalidas.size( ) ;
//			
//			// inicializa las salidas
//			nombreSalidas = new String[ tam ] ;
//			descripcionSalidas = new String[ tam ] ;
//			
//			int index = 0 ;
//			
//			// las recorre
//			for( TblFormaSalida sal : formaSalidas )
//			{
//				nombreSalidas[ index ] = sal.getNombre( ) ;
//				descripcionSalidas[ index++ ] = sal.getDescripcion( ) ;
//			}
//		}
	}

	public String getArchivoFormaName() {
		return archivoFormaName;
	}

	public void setArchivoFormaName(String archivoFormaName) {
		this.archivoFormaName = archivoFormaName;
	}

	public int getCveForma() {
		return cveForma;
	}

	public void setCveForma(int cveForma) {
		this.cveForma = cveForma;
	}

	public List<MultipleDataTO> getSalidas() {
		return salidas;
	}

	public FormFile getArchivoForma() {
		return archivoForma;
	}

	public void setArchivoForma(FormFile archivoForma) {
		this.archivoForma = archivoForma;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public String[] getNombreSalidas() {
		return nombreSalidas;
	}

	public void setNombreSalidas(String[] nombreSalidas) {
		this.nombreSalidas = nombreSalidas;
	}

	public String[] getDescripcionSalidas() {
		return descripcionSalidas;
	}

	public void setDescripcionSalidas(String[] descripcionSalidas) {
		this.descripcionSalidas = descripcionSalidas;
	}

	public ActionErrors validate( ActionMapping mapping , HttpServletRequest request )
	{
		ActionErrors errors = new ActionErrors( ) ;
		
		System.out.println( "FormasEditarForm.java: nombre - " + nombre ) ;
		
		int operation = getOperacion( ) ;
		if( operation == -1 )
			return errors ;
		
		if( operation == 1 )
		{
			if( cveSalida < 1 )
				errors.add( "NombreEmpty" , new ActionMessage( "com.mastercard.assets.web.modules.forms.add.errors.CveSalidaWrongLI" ) ) ;
			
			return errors ;
		}
		
		if( operation == 3 )
		{
			return errors ;
		}
		
		// en caso de vacios
		if( nombre == null || nombre.trim( ).length( ) == 0 )
			errors.add( "NombreEmpty" , new ActionMessage( "com.mastercard.assets.web.modules.forms.add.errors.NombreEmpty" ) ) ;
		
		if( descripcion == null || descripcion.trim( ).length( ) == 0 )
			descripcion = "" ;
		
		System.out.println( "NombreSalidas: " + nombreSalidas ) ;
		System.out.println( "DescripcionSalidas: " + descripcionSalidas ) ;
		
		int salidasActuales = 0 ;
		
		// en caso d eque no haya mas salidas
		if( this.formasSalidasId == null )
			salidasActuales = 0 ;
		else
			salidasActuales = formasSalidasId.length ;
		
		System.out.println( "Salidas Actuales: " + salidasActuales ) ;
		
		// en caos de que no haya salidas actuales
		if( salidasActuales == 0 )
		{
			if( nombreSalidas == null || nombreSalidas.length == 0 )
			{
				nombreSalidas = new String[ 0 ] ;
				errors.add( "NombreEmpty" , new ActionMessage( "com.mastercard.assets.web.modules.forms.add.errors.SalidasEmpty" ) ) ;
			}
			// en caso de que no esten vacios
			else
			{
				System.out.println( "Tamanio: " + nombreSalidas.length ) ;
				// revisa que no todos esten vacios
				boolean vaciosTodos = true ;
				
				// recorre los nombres
				for( String nombre : nombreSalidas )
					// en caso de que uno este no vacio
					if( nombre != null && nombre.trim( ).length( ) > 0 )
					{
						vaciosTodos = false ;
						
						break ;
					}
				
				// en caso de que esten todos vacios
				if( vaciosTodos )
					errors.add( "SalidasTodasVacias" , new ActionMessage( "com.mastercard.assets.web.modules.forms.add.errors.SalidasAllEmpty" ) ) ;
				
				if( errors.size( ) == 0 )
				{
					// recorre los nombres para ver si hay repetidos
					for( int i = 0 ; i < nombreSalidas.length ; i++ )
					{
						// recorre desde el siguiente al final
						for( int j = i + 1 ; j < nombreSalidas.length ; j++ )
						{
							if( nombreSalidas[ i ].equals( nombreSalidas[ j ] ) )
							{
								// agrega error
								errors.add( "SalidasRepetidas" , new ActionMessage( "com.mastercard.assets.web.modules.forms.add.errors.SalidasRepetidas" ) ) ;
								
								break ;
							}
							
							if( errors.size( ) > 0 )
								break ;
						}
					}
				}
			}
			
			if( descripcionSalidas == null || descripcionSalidas.length == 0 )
			{
				descripcionSalidas = new String[ 0 ] ;
			}
		}// termina if para slidas actuales
		// en caso de que si haya salidas actuales
		else
		{
			if( nombreSalidas != null )
				// recorre las salidas que puso
				for( String nombreSalida : nombreSalidas )
				{
					// verifica que no haya salida en la forma con el mismo nombre
					// en caso de que si haya
					if( MasterCardDAO.existActiveExitNameInForm( cveForma , nombreSalida ) )
						// coloca error y quiebra
						// agrega error
						errors.add( "SalidasRepetida" , new ActionMessage( "com.mastercard.assets.web.modules.forms.add.errors.SalidasRepetida" , nombreSalida ) ) ;
				}
		}
		
		// en caso de que no haya archivo
		if( hayArchivo == null || hayArchivo.trim( ).length( ) == 0 )
		{
			// revisa el archivo
			if( archivoForma == null || archivoForma.getFileName( ) == null || archivoForma.getFileName( ).trim( ).length( ) == 0 )
				errors.add( "FileEmpty" , new ActionMessage( "com.mastercard.assets.web.modules.forms.add.errors.FileEmpty" ) ) ;
		}
		
		// en caso de no haber errores
		if( errors.size( ) == 0 )
		{
			// inicia las salidas
			salidas = new ArrayList< MultipleDataTO >( ) ;
			
			if( nombreSalidas != null )
				// recorre los nombres
				for( int i = 0 ; i < nombreSalidas.length ; i++ )
				{
					// lo agrega a las salidas
					if( descripcionSalidas.length > i )
						salidas.add( new MultipleDataTO( nombreSalidas[ i ] , ( ( descripcionSalidas[ i ] == null || descripcionSalidas[ i ].trim( ).length( ) == 0 ) ? "" : descripcionSalidas[ i ] ) ) ) ;
					else
						salidas.add( new MultipleDataTO( nombreSalidas[ i ] , "" ) ) ;
				}
		}
		
		if( errors.size( ) > 0 )
		{
			System.out.println( request.getAttribute( "FormasEditarForm" ) ) ;
			request.setAttribute( "FormasEditarForm" , this ) ;
			UserLogin user = ( UserLogin ) request.getSession( ).getAttribute( "UserLogin" ) ;
			
			// levanta la forma
			TblForma forma = MasterCardDAO.findFormaById( cveForma ) ;

			setArchivoFormaName( forma.getArchivoForma( ) ) ;
			
			// lo coloca en el form adecuado
			if( MCUtil.getFormaJSPFilePath( forma.getCveForma( ) ) == null )
				// en caso de que exista guarda un 1, sino un 0
				this.setExistFile( 0 ) ;
			else
				this.setExistFile( 1 ) ;
			
			List< TblFormaSalida > salidas = new ArrayList< TblFormaSalida >( ) ;
			
			List< TblFormaSalida > salidasA = forma.getTblFormaSalidas( ) ;
			
			for( TblFormaSalida sal : salidasA )
			{
				// en cao de activa
				if( sal.getStatus( ) == 1 )
					salidas.add( sal ) ;
			}
			
			this.setFormaSalidas( salidas ) ;
			
			user.setNextWorkArea( "/WEB-INF/pages/WorkArea/FormasEditarDesplegarFormulario.jsp" ) ;
		}
		
                MasterCardDAO.closeEntityManager( ) ;
		return errors ;
	}

}
